//package nancal.mp.db.mongo.extend
//
//import nancal.mp.db.mongo.entity.dev.ApiInstance
//import nancal.mp.db.mongo.entity.dev.ApiInterceptor
//import nancal.mp.db.mongo.entity.dev.ApiStory
//import nancal.mp.db.mongo.mor
//import nbcp.base.comm.StringMap
//import nbcp.base.enums.JsonStyleScopeEnum
//import nbcp.base.extend.*
//import nbcp.base.utils.HttpInvoke()
//import nbcp.base.utils.JavaScriptExecutor
//import nbcp.base.utils.UrlUtil
//import nbcp.myoql.db.mongo.query
//import nbcp.myoql.db.mongo.updateById
//import java.time.LocalDateTime
//
//
//private var jsFunctions = """
//var map = function(list,func){
//    var ret = new Array();
//    var index = -1;
//    while(true) {
//        index ++;
//
//        if( index >= list.length){
//         break;
//        }
//        ret.push( func( list[index] ) );
//    }
//    return ret;
//}
//
//var indexOf = function(list,func){
//    var ret = new Array();
//    var index = -1;
//    while(true) {
//        index ++;
//
//        if( index >= list.length){
//          break;
//        }
//
//        if( func( list[index] ) === true){
//            return index;
//        }
//    }
//    return -1;
//}
//
//
//var url2json = function(url){
//  var query = (url || "").split("#")[0].split("?").slice(-1)[0];
//  if(!query){
//      return {};
//  }
//
//  var ret = new Object();
//  var ps = query.split("&");
//  for(var i=ps.length-1;i>=0;i--){
//    var kv = ps[i].split("=");
//    if( kv.length == 1){
//        ret[kv[0]] = true;
//    }
//    else{
//        ret[kv[0]] = kv[1];
//    }
//  }
//  return ret;
//}
//"""
//
//private fun getParameterScriptValue(script: String, container: ApiStory, index: Int): String {
//
//    var eng = JavaScriptExecutor()
//    var js = """
//function get(apis, prevApi){
//
//${jsFunctions}
//${
//        if (script.contains("\n")) {
//            ""
//        } else {
//            "return "
//        }
//    } ${script}
//} """
//
//
//    var prevApi: ApiInstance? = null;
//    if (container.apis.size > 0 && index > 0) {
//        prevApi = container.apis[index - 1]
//    }
//
//    return eng.evalFunction(
//        js, "get",
//        container.apis,
//        prevApi
//    ).AsString()
//}
//
//private fun getParameterMap(api: ApiInstance, container: ApiStory): StringMap {
//    var map = StringMap();
//    api.parameters.forEach {
//        it.value;
//        if (it.script.HasValue) {
//            it.value = getParameterScriptValue(
//                it.script,
//                container,
//                container.apis.indexOf(api)
//            )
//        }
//
//        if (it.value.isNullOrEmpty()) {
//            return@forEach
//        }
//
//        map.put(it.key, it.value);
//    }
//
//    return map;
//}
//
//private fun getRequestUrl(api: ApiInstance, container: ApiStory, parameterMap: StringMap): String {
//    var url = container.apiAddress + api.apiDefine.url;
//
//
//    url = url.formatWithJson(parameterMap, valueCallback = { k, v ->
//        UrlUtil.encodeURIComponent(v!!)
//    });
//
//    if (!url.endsWith("?")) {
//        url += "?"
//    }
//
//    url += api.apiDefine.requestUrlQueryParameters.map {
//        var v = parameterMap.get(it.key).AsString(it.defaultValue)
//
//        if (v.isNullOrEmpty()) {
//            return@map ""
//        }
//
//        return@map it.key + "=" + nbcp.base.utils.UrlUtil.encodeURIComponent(v)
//    }.joinToString("&")
//
//    return url;
//}
//
//
//private fun invokeFirstRequest(api: ApiInstance, story: ApiStory, interceptor: ApiInterceptor) {
//    var eng = JavaScriptExecutor()
//    var js = """
//function first(api,story, globalHeaders){
//
//${jsFunctions}
//
//${interceptor.firstScript}
//} """
//    eng.evalFunction(js, "first", api, story, interceptor.globalHeaders)
//}
//
//private fun invokePreRequest(api: ApiInstance, story: ApiStory, interceptor: ApiInterceptor) {
//    var eng = JavaScriptExecutor()
//    var js = """
//function pre(api, story, globalHeaders){
//
//${jsFunctions}
//
//${interceptor.requestScript}
//} """
//    eng.evalFunction(js, "pre", api, story, interceptor.globalHeaders)
//}
//
//private fun invokePostRequest(api: ApiInstance, story: ApiStory, interceptor: ApiInterceptor) {
//    var eng = JavaScriptExecutor()
//    var js = """
//function post(api, story, globalHeaders){
//
//${jsFunctions}
//
//${interceptor.responseScript}
//} """
//    eng.evalFunction(js, "post", api, story, interceptor.globalHeaders)
//}
//
//
//fun ApiStory.runApi(apiInstance: ApiInstance) {
//    var apiBak = apiInstance.ToJson().FromJson<ApiInstance>()!!;
//
//    var parameterMap = getParameterMap(apiInstance, this);
//
//    var interceptors = mor.dev.apiInterceptor.query()
//        .where { it.isActive mongoEquals true }
//        .toList();
//
//    interceptors.forEach {
//        invokeFirstRequest(apiInstance, this, it);
//    }
//
//
//    var url = getRequestUrl(apiInstance, this, parameterMap);
//
//    var http = HttpInvoke()(url);
//    http.request.httpMethod = apiInstance.apiDefine.httpMethod
//
//    apiInstance.apiDefine.requestHeaderParameters.forEach {
//        var v = parameterMap.get(it.key).AsString(it.defaultValue)
//        if (v.isNullOrEmpty()) {
//            return@forEach
//        }
//        http.request.headers.put(it.key, v);
//    }
//
//
//    if (apiInstance.postBodyScript.HasValue) {
//        apiInstance.postBody = getParameterScriptValue(
//            apiInstance.postBodyScript,
//            this,
//            this.apis.indexOf(apiInstance)
//        );
//    }
//
//    if (apiInstance.postBody.HasValue) {
//        if (apiInstance.apiDefine.requestBodyParameters.items.size > 0) {
//            http.request.contentType = "application/json";
//        }
//        http.request.postBody = apiInstance.postBody;
//    }
//
//    interceptors.forEach {
//        invokePreRequest(apiInstance, this, it);
//    }
//
//    var res = http.doNet()
//
//    apiInstance.status = http.status;
//    apiInstance.responseHeader = http.response.headers
//    apiInstance.responseBody = res
//    if (http.response.contentType.contains("json")) {
//        if (res.startsWith("{") && res.endsWith("}")) {
//            apiInstance.responseBody = res.FromJson<Map<*, *>>().ToJson(JsonStyleScopeEnum.PRETTY)
//        } else if (res.startsWith("[") && res.endsWith("]")) {
//            apiInstance.responseBody = res.FromListJson(Map::class.java).ToJson(JsonStyleScopeEnum.PRETTY)
//        }
//    }
//
//    apiInstance.lastExecuteAt = LocalDateTime.now()
//
//    interceptors.forEach {
//        invokePostRequest(apiInstance, this, it);
//    }
//
//    interceptors.forEach { interceptor ->
//        mor.dev.apiInterceptor.updateById(interceptor.id)
//            .set { it.globalHeaders to interceptor.globalHeaders }
//            .exec()
//    }
//
//    apiInstance.apiDefine = apiBak.apiDefine;
//}